package com.zjdiepu.www.util;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

import com.zjdiepu.www.common.util.CollectionInitUtil;
import com.zjdiepu.www.common.util.ReflectUtil;

/**
 * 对象操作工具
 * 1.判断是否为空
 *
 * @author xiongxiaotun
 * @date 2017年3月3日 下午4:38:01
 * @since v1.0.0
 * @update
 */
public class ObjectUtil {
	/**
	 * 获取属性值
	 * @author xiongxiaotun@126.com
	 * @time 2017年3月23日 下午7:55:48
	 * @since 1.0.0
	 * @update
	 * @param fieldNames
	 * @param t
	 * @return
	 */
	public static Object[] getArrayValues(String[] fieldNames, Object t) {
		if(null == t || ArrayUtils.isEmpty(fieldNames)){
			ExceptionHelper.thow("100501", "参数为空");
		}
		int length = fieldNames.length;
		Object[] result = new Object[length];
		for(int i = 0; i< length; i++){
			result[i] = ReflectUtil.getValue(fieldNames[i], t);
		}
		return result;
	}
	
	/**
	 * 获取属性值
	 * @author xiongxiaotun@126.com
	 * @time 2017年3月23日 下午7:55:48
	 * @since 1.0.0
	 * @update
	 * @param fieldNames
	 * @param t
	 * @return
	 */
	public static List<Object> getListValues(String[] fieldNames, Object t) {
		if(null == t || ArrayUtils.isEmpty(fieldNames)){
			ExceptionHelper.thow("100501", "参数为空");
		}
		int length = fieldNames.length;
		List<Object> result = CollectionInitUtil.emptyList();
		for(int i = 0; i< length; i++){
			result.add(ReflectUtil.getValue(fieldNames[i], t));
		}
		return result;
	}
	
	/**
	 * 判断对象是否为非空<br/>
	 * 按使用频率依次判断<br/>
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午4:38:47
	 * @since v1.0.0
	 * @update
	 * @param obj
	 * @return
	 */
	public static boolean isNotEmpty(Object obj){
		return !isEmpty(obj);
	}
	
	/**
	 * 判断对象是否为空<br/>
	 * 按使用频率依次判断<br/>
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午4:38:47
	 * @since v1.0.0
	 * @update
	 * @param obj
	 * @return
	 */
	public static boolean isEmpty(Object obj){
		return isEmpty(obj, false);
	}
	
	/**
	 * 判断对象是否为空<br/>
	 * 按使用频率依次判断<br/>
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午4:38:47
	 * @since v1.0.0
	 * @update
	 * @param obj
	 * @param checkZero 检查值是否为0
	 * @return
	 */
	public static boolean isEmpty(Object obj, boolean checkZero){
		if(null == obj) {
			return true;
		}
		Class<?> clazz = obj.getClass();
		if(clazz.isAssignableFrom(String.class)){ //string
			return StringUtils.isBlank((String)obj);
		} else if(clazz.isAssignableFrom(Collection.class)){ //collection
			return CollectionUtils.isEmpty((Collection<?>)obj);
		} else if(clazz.isAssignableFrom(Map.class)) { //map
			return MapUtils.isEmpty((Map<?,?>)obj);
		} else if(clazz.isArray()) { //array
			return isEmptyArray(obj);
		} else if(checkZero && ClassUtils.isPrimitiveOrWrapper(clazz)) {
			return isEmptyPrimitiveOrWrapper(obj);
		}
		return false;
	}
	
	/**
	 * 判断是否为空的基本类型/封装类型<br/>
	 *
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午5:09:50
	 * @since v1.0.0
	 * @update
	 * @param obj
	 * @return
	 */
	public static boolean isEmptyPrimitiveOrWrapper(Object obj) {
		if(null == obj) {
			return true;
		}
		Class<?> clazz = obj.getClass();
		if(clazz.isAssignableFrom(boolean.class) || clazz.isAssignableFrom(Boolean.class)) {
			return Boolean.FALSE == obj;
		} else if(clazz.isAssignableFrom(byte.class) || clazz.isAssignableFrom(Byte.class)) {
			return NumberUtils.BYTE_ZERO == obj;
		} else if(clazz.isAssignableFrom(short.class) || clazz.isAssignableFrom(Short.class)) {
			return NumberUtils.SHORT_ZERO == obj;
		} else if(clazz.isAssignableFrom(char.class) || clazz.isAssignableFrom(Character.class)) {
			return Character.isSpaceChar((Character)obj);
		} else if(clazz.isAssignableFrom(int.class) || clazz.isAssignableFrom(Integer.class)) {
			return NumberUtils.INTEGER_ZERO == obj;
		} else if(clazz.isAssignableFrom(long.class) || clazz.isAssignableFrom(Long.class)) {
			return NumberUtils.LONG_ZERO == obj;
		} else if(clazz.isAssignableFrom(float.class) || clazz.isAssignableFrom(Float.class)) {
			return NumberUtils.FLOAT_ZERO == obj;
		} else if(clazz.isAssignableFrom(double.class) || clazz.isAssignableFrom(Double.class)) {
			return NumberUtils.DOUBLE_ZERO == obj;
		}
		return false;
	}
	
	/**
	 * 判断对象是否为空数组<br/>
	 *
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午5:25:57
	 * @since v1.0.0
	 * @update
	 * @param obj
	 * @return
	 */
	public static boolean isEmptyArray(Object obj) {
		if(null == obj) {
			return true;
		}
		Class<?> clazz = obj.getClass();
		if(!clazz.isArray()) {
			return false;
		}
		Class<?> componentType = clazz.getComponentType();
		if(componentType.isAssignableFrom(boolean.class)) {
			return ArrayUtils.isEmpty((boolean[])obj);
		} else if(componentType.isAssignableFrom(byte.class)) {
			return ArrayUtils.isEmpty((byte[])obj);
		} else if(componentType.isAssignableFrom(short.class)) {
			return ArrayUtils.isEmpty((short[])obj);
		} else if(componentType.isAssignableFrom(char.class)) {
			return ArrayUtils.isEmpty((char[])obj);
		} else if(componentType.isAssignableFrom(int.class)) {
			return ArrayUtils.isEmpty((int[])obj);
		} else if(componentType.isAssignableFrom(long.class)) {
			return ArrayUtils.isEmpty((long[])obj);
		} else if(componentType.isAssignableFrom(float.class)) {
			return ArrayUtils.isEmpty((float[])obj);
		} else if(componentType.isAssignableFrom(double.class)) {
			return ArrayUtils.isEmpty((double[])obj);
		} else {
			return ArrayUtils.isEmpty((Object[])obj);
		}
	}
	
	/**
	 * 判断对象是否为基本类型或封装类型
	 *
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午5:25:57
	 * @since v1.0.0
	 * @update
	 * @param obj
	 * @return
	 */
	public static boolean isPrimitiveOrWrapper(Object obj) {
		if(null == obj) {
			return false;
		}
		Class<?> clazz = obj.getClass();
		return ClassUtils.isPrimitiveOrWrapper(clazz);
	}
}
